package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputStream 缓冲输出流  写  bos.txt
 *        BufferedOutputStream 缓冲输入流   写入
 */
public class IOSAPI {
    /**
     * 缓冲输入流：构造器--->异常对象
     * 字符流【转换流】---解决:缓冲输入读取单位 为字节问题
     * InputStreamReader  读取单位：字符
     * OutputStreamWriter 写出单位：字符 调用字符串getBytes写出文本
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream(低级流引用，size:存在字节数组【指定】)
     * 问题1：不能指定字符集
     *    2：不能按照字符读取
     */
    @Test
    public void testBIS(){
       /* //创建低级流
        FileInputStream fis=
                new FileInputStream("bos.txt");
        //创建高级流---指定字符集---缓冲不具备功能---新【转换流】
        BufferedInputStream bos=
                new BufferedInputStream(fis);
        /**
         * read----读
         */
        //bos.read();
        }
    /**
     * 针对缓冲输出/入功能上的限定---输出：文本
     * 字符流【转换流】---解决缓冲输入流读取单位 为字节问题
     * InputStreamReader  读取单位：字符
     *  OutputStreamWriter 写出单位：字符 调用字符串getBytes写出文本
     *  需求：重写写流---针对：文字  写出文本：osw.txt
     */
    @Test
    public void testOSW(){
        //标准流：1.置空流
        FileOutputStream fos=null;
        OutputStreamWriter osw=null;
        //标准流：2.捕获异常
        //创建低级流
        try {
            fos=new FileOutputStream("osw.txt");
            //不考虑效率---只输出文本---字符输出流:输出单位字符形式
            osw=new OutputStreamWriter(fos,"UTF8");
            //write() 直接写出文本【不需要将文本转换为字节数组】
            osw.write("666");
            osw.write("555\n");//换行：字符 char
            osw.write("777");
        } catch(FileNotFoundException e){//文件不存在
            e.printStackTrace();
        }
        catch(UnsupportedEncodingException e){//字符集转换
            e.printStackTrace();
        }
        catch (IOException e) {//IO流异常，所有传输失败总异常
            e.printStackTrace();
        } finally {
        }
        //关闭高级流：字符输出流
        if(osw!=null) {
            try {
                osw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
    /**高级流【处理流】---转换流【字符流】，特点：套在低级流上，被其他高级流套上
     * 字符输入流 --- 单元测试：testISR() 读入 文本【字符串】
     * 字符输出流 --- 单元测试：testOSW() 写出 文本【字符串】
     * InputStreamReader   字符输入流  不可以读入文本
     *
     * 高级流【处理流】----转换流【字符流】---缓冲字符流：解决读入，写出都是字符形式
     * BufferedReader 缓冲字符输入流---解决：InputStreamReader读入字节形式
     *                                    BufferedReader读入字符形式
     *BufferdWriter
     * 需求：ISR文字输入流读取 osw.txt 文件  ？？
     *     当前代码转换为标准流IO：捕获所有异常
     *     读取每行文本？  readLine() 提示：不为null代表文本写出
     *     写出    参考：CV复制粘贴
     */
    @Test
    public void testISR() throws IOException {

        //创建低级流

            FileInputStream fis=new FileInputStream("osw.txt");
            //创建高级流---转换流---字符输入流
            InputStreamReader isr=new InputStreamReader(fis);
            //读 read()  问题：读入数据单位：字节，而不是字符，读字符
            //               转换流---套高级流：缓冲字符输出/入流
            //创建高级流---针对转换流中：字符输入流无法读取形式
            //                       字符的情况--缓冲字符输入流
            BufferedReader br=new BufferedReader(isr);
            /**BufferedReader类
             * readLine() 读入若干字符串，直到读到没有换行符为止
             *
             */
            String line=null;

            while((line =br.readLine())!=null){
            System.out.println("打印字符串："+line);
            }

    }
    /**
     * 作业2：读入IOSAPI.java文件---所有代码---写出控制台
     *
     */
    @Test
    public void testHomeWork2() throws IOException {
     //1.创建低级流---读入--找IOSAPI.java  代表路径：File.separator
        //路径：src\main\java\com\tedu\api\io\IOSAPI.java
        FileInputStream fis=new FileInputStream("src"+File.separator+""+
                "main"+File.separator+"" +
                "java"+File.separator+""+
                "com"+File.separator+""+
                "tedu"+File.separator+"" +
                "api"+File.separator+"" +
                "io"+File.separator+"IOSAPI.java");
        //2.创建高级流---【读入内容是文本】--转换流---无法读取文本【int】
        InputStreamReader isr=new InputStreamReader(fis,"UTF8");
        //3.创建高级流---缓冲输入流---读取文本
        BufferedReader br=new BufferedReader(isr);
        //4.创建变量：字符串类型---保存每次读取的一行文本
        String line=null;//null代表没有内容【等同于换行】
        //5.一直读入：每行文本保存line中，如果line不为null，一直读
        while((line =br.readLine())!=null){
            System.out.println("打印字符串："+line);
        }

        //6.关闭高级流
        fis.close();
        isr.close();
        br.close();
    }
    /**高级流：
     * BufferedWriter----低配版本输出流【缓冲输出流】
     * PrintWriter----高配版本输出流【字符输出流】
     * 1.高级流不能直接 创建----直接创建【不需要构建低级流】--封装
     * 2.封装内存所有流的特点
     * 需求:写出文件 pw.txt---文本内容：需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        FileOutputStream fos=new FileOutputStream("pw.txt");
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
        BufferedWriter bw = new BufferedWriter(osw);
            //创建高级流
           PrintWriter  pw= new PrintWriter(bw);

        //写出功能  print() 打印一行文本  不换行
        //         println() 打印一行文本换行
        pw.println("你就是");
        pw.println("我的小可爱");
        pw.close();
    }
}
